
////////////////////////此代码为失败品/////////////////////
/////////////////////// 失败品      ////////////////////
public class ArrayQueueFailed {
    public int maxSize;//队列最大存储量
    public int front;//队列的头部
    public int rear;//队里的尾部
    private int useSize;
    int[]array;//数组
    //private boolean flag=true;//第一次插入队列元素的"钥匙"

    //循环队列的构造方法
    public ArrayQueueFailed(int maxSize){
        this.maxSize=maxSize;
        array=new int[maxSize];
        front=0;//默认头部和尾部都一开始指向0下标
        rear=0;
        useSize=0;
    }

    public void insert(int key){
        //判断对列是否为满
        if(isFull()){
            System.out.println("数组已满,无法插入");
            throw new RuntimeException("队列已满，插入失败");
            //return;
        }
        if(rear==front&&useSize==0){
            array[rear]=key;
            System.out.println("第一次插入元素");
           useSize++;
            return;
        }
        rear=(rear+1)%maxSize;//获取新的rear下标
        array[rear]=key;
        useSize++;

    }

    //取出队首元素
    public int push(){
        //判断队列是否为空
        if(isEmpty()){
            throw new RuntimeException("队列为空，取出元素失败(push)");
        }
        int head=array[front];
        front=(front+1)%maxSize;
        useSize--;
        return head;
    }

    //判断循环队列是否已满
    public boolean isFull(){
        //因为该队列是一个基于数组实现的循环队列
        //所以要想充分利用数组空间，就要利用取模的方法将数组变成循环的
        if((rear+1)%maxSize==front){//后面的布尔表达式含义为：除了队列为空的情况
            return true;
        }
        return false;
    }

    //判断循环队列是否为空
    public boolean isEmpty(){
        //着这种设置循环队列的方式，只有当rear==front时才代表队列为空
        if(rear==front&&useSize==0){
            System.out.println("队列为空，请插入元素");
            return true;
        }
        return false;
    }
}
